Break out the hotplug cleanup code into xen-hotplug-cleanup. Claim the block
authoremellor@leeni.uk.xensource.com <emellor@leeni.uk.xensource.com>
Mon, 27 Feb 2006 16:16:04 +0000 (17:16 +0100)
committeremellor@leeni.uk.xensource.com <emellor@leeni.uk.xensource.com>
Mon, 27 Feb 2006 16:16:04 +0000 (17:16 +0100)
script's lock before doing the cleanup, to avoid a race that causes the message
"xenstore-list: could not list path backend/vbd/40" in /var/log/hotplug.log,
with a subsequent refusal to create the domain, after a domain reboot.

Signed-off-by: Ewan Mellor <ewan@xensource.com>
tools/examples/Makefile
tools/examples/xen-backend.agent
tools/examples/xen-backend.rules
tools/examples/xen-hotplug-cleanup [new file with mode: 0644]

index 8ffd7949722e98642b8d38f6c5a909ae78055743..6e71f563bf8867e02da3b49e28f3cdfec37b7b31 100644 (file)
@@ -27,6 +27,7 @@ XEN_SCRIPTS += network-nat vif-nat
 XEN_SCRIPTS += block
 XEN_SCRIPTS += block-enbd block-nbd
 XEN_SCRIPTS += vtpm vtpm-delete
+XEN_SCRIPTS += xen-hotplug-cleanup
 XEN_SCRIPT_DATA = xen-script-common.sh locking.sh logging.sh
 XEN_SCRIPT_DATA += xen-hotplug-common.sh xen-network-common.sh vif-common.sh
 XEN_SCRIPT_DATA += block-common.sh vtpm-common.sh vtpm-hotplug-common.sh
index 670c24b77515c5725f735478cff6f6931ecca9b6..72bbafda21b5af5f34f45855f0838c719030568a 100755 (executable)
@@ -18,7 +18,7 @@ case "$ACTION" in
   add)
     ;;
   remove)
-    /etc/xen/scripts/xen-hotplug-cleanup.sh
+    /etc/xen/scripts/xen-hotplug-cleanup
     ;;
   online)
     ;;
index aec5c46121065ffd72229c31017e22dc07516efd..91f0b06107e0401f7eb9ff2e98d185c006f903b1 100644 (file)
@@ -2,6 +2,4 @@ SUBSYSTEM=="xen-backend", KERNEL=="vbd*", RUN+="/etc/xen/scripts/block $env{ACTI
 SUBSYSTEM=="xen-backend", KERNEL=="vtpm*", RUN+="/etc/xen/scripts/vtpm $env{ACTION}"
 SUBSYSTEM=="xen-backend", KERNEL=="vif*", ACTION=="online", RUN+="$env{script} online"
 SUBSYSTEM=="xen-backend", KERNEL=="vif*", ACTION=="offline", RUN+="$env{script} offline"
-SUBSYSTEM=="xen-backend", ACTION=="remove", RUN+="/bin/bash -c '/usr/bin/xenstore-rm -t $$(/usr/bin/xenstore-read $env{XENBUS_PATH}/frontend)'"
-SUBSYSTEM=="xen-backend", ACTION=="remove", RUN+="/usr/bin/xenstore-rm -t $env{XENBUS_PATH}"
-SUBSYSTEM=="xen-backend", ACTION=="remove", RUN+="/usr/bin/xenstore-rm -t error/$env{XENBUS_PATH}"
+SUBSYSTEM=="xen-backend", ACTION=="remove", RUN+="/etc/xen/scripts/xen-hotplug-cleanup"
diff --git a/tools/examples/xen-hotplug-cleanup b/tools/examples/xen-hotplug-cleanup
new file mode 100644 (file)
index 0000000..4e9c0ca
--- /dev/null
@@ -0,0 +1,21 @@
+#! /bin/sh
+
+dir=$(dirname "$0")
+. "$dir/xen-hotplug-common.sh"
+
+# Claim the lock protecting /etc/xen/scripts/block.  This stops a race whereby
+# paths in the store would disappear underneath that script as it attempted to
+# read from the store checking for device sharing.
+# Any other scripts that do similar things will have to have their lock
+# claimed too.
+# This is pretty horrible, but there's not really a nicer way of solving this.
+claim_lock "block"
+
+# remove device frontend store entries
+xenstore-rm -t $(xenstore-read "$XENBUS_PATH/frontend") || true
+
+# remove device backend store entries
+xenstore-rm -t "$XENBUS_PATH"       || true
+xenstore-rm -t "error/$XENBUS_PATH" || true
+
+release_lock "block"